#include <iostream>
#include <unistd.h>
#include <string>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

using namespace std;

const string dev = "/dev/null";

void Daemon(const string dir = "")
{
    // 1.关闭一些信号，防止被一些不必要的信号干扰
    signal(SIGCLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);
    signal(SIGSTOP, SIG_IGN);

    // 2.开始守护，创建子进程，并使父进程直接退出，并让子进程在一个新的会话中去
    if (fork() > 0)
        exit(0);
    setsid();

    // 3.改变工作目录(一般服务器是被部署到根目录，当然也可以不改)
    if(!dir.empty())
        chdir(dir.c_str());

    // 4.将标准输入，标准输出，标准错误重定向到 /dev/null中，日志信息写到文件中，意思就是都不显示到屏幕上去
    int fd = open(dev.c_str(), O_RDWR);
    if(fd > 0)
    {
        dup2(fd,0);
        dup2(fd,1);
        dup2(fd,2);
    }
}